﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BKH.BLL;
using BKH.MyUserControl.UCHienThi;
using BKH.MyUserControl.UCMenu;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Data.Common;
using System.Collections;


namespace BKH.MyUserControl.UCHienThi
{
    public partial class ucDangKyKham : UserControl
    {
        KhoaBUO khoabuo = new KhoaBUO();
        BenhNhanBUO bnBUO = new BenhNhanBUO();

        String idBN;

        public ucDangKyKham(String IDBN)
        {
            InitializeComponent();
            LoadCB();
            this.idBN = IDBN;
            showNameBN();
            showComboBox();
            this.cbbKhoa.SelectedIndexChanged += new System.EventHandler(this.cbbKhoa_SelectedIndexChanged);

        }

        void showNameBN()
        {
            tbl_BenhNhan obj = bnBUO.GetSingle(int.Parse(idBN));
            lbBenhNhan.Text = obj.FirstName + " " + obj.LastName;
        }
        HospitalDBDataContext context = new HospitalDBDataContext();

        void showComboBox()
        {
            cbbKhoa.DataSource = khoabuo.GetAll();
            cbbKhoa.DisplayMember = "WardName";
            cbbKhoa.ValueMember = "id_Ward";

        }
        private void btnDangKy_Click(object sender, EventArgs e)
        {
            //lay id khoa
            int khoaid = int.Parse(cbbKhoa.SelectedValue.ToString());
            //thên lần khám
            Insert_BN_LanKham();
            //Lay id lan kham
            int lankhamid = lanKhamCuoi();

            if (cbbNoiNgoaiTru.SelectedItem.ToString().Equals("Ngoại trú"))
            {
                grbKeDonXepCho.Controls.Clear();
                ucKeDonNgoaiTru ucNgoaiTru = new ucKeDonNgoaiTru(khoaid, lankhamid);
                grbKeDonXepCho.Controls.Add(ucNgoaiTru);
            }

            if (cbbNoiNgoaiTru.SelectedItem.ToString().Equals("Nhập viện"))
            {
                grbKeDonXepCho.Controls.Clear();
                ucNhapVien ucNhapVien = new ucNhapVien(lankhamid,khoaid);
                grbKeDonXepCho.Controls.Add(ucNhapVien);
            }
            btnDangKy.Visible = false;
            //Thêm đơn
            insertDonThuoc();
        }

        //Them vao bang tbl_BenhNhan_LanKham
        void Insert_BN_LanKham()
        {
            try
            {
                tbl_BenhNhan_LanKham tbl_BN_LanKham = new tbl_BenhNhan_LanKham();
                BenhNhan_LanKhamBUO bnlkbuo = new BenhNhan_LanKhamBUO();

                tbl_BN_LanKham.BenhNhanID = int.Parse(idBN);
                tbl_BN_LanKham.NhanVienID = int.Parse(cbbBacSy.SelectedValue.ToString());
                tbl_BN_LanKham.LoaiKhamID = int.Parse(cbbNoiNgoaiTru.SelectedValue.ToString());
                tbl_BN_LanKham.NgayKham = DateTime.Now.ToShortDateString();
                tbl_BN_LanKham.Room = txtPhongKham.Text;
                tbl_BN_LanKham.ChuanDoan = txtChanDoan.Text;

                if (bnlkbuo.Insert(tbl_BN_LanKham))
                {
                    lbThongBao.Text = "Đăng ký thành công";
                }
                else
                {
                    lbThongBao.Text = "Đăng ký ko thành công";
                }
            }
            catch (Exception)
            {

                MessageBox.Show("Vui lòng nhập đủ các thông tin trên");
            }
            

        }
        /// <summary>
        /// Kiểm tra một bệnh nhân đã có trong ds chờ hay ko
        /// </summary>
        /// <returns></returns>
        
        Boolean kiemTraCoBNTrongDsCho(int bnID)
        {

            var list = context.tbl_BenhNhans.Join(context.tbl_BenhNhan_LanKhams,
                        a => a.BenhNhanID,
                        b => b.BenhNhanID,
                        (a, b) => new
                        {
                            LanKhamID = b.LanKhamID,
                            BenhNhanID = b.BenhNhanID
                        }).Join(context.tbl_BenhNhanNoiTrus,
                            c => c.LanKhamID,
                            d => d.LanKhamID,
                            (c, d) => new
                            {
                                isWait = d.IsWait,
                                BenhNhanID = c.BenhNhanID
                            }
                        ).Where(n => n.BenhNhanID == bnID);
            if (list.ToList().Count==0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        //
        void insertDonThuoc()
        {
            try
            {
                BenhNhan_LanKhamBUO nblk = new BenhNhan_LanKhamBUO();
                DonThuocBUO donbuo = new DonThuocBUO();
                //MessageBox.Show(bn.LanKhamID.ToString());
                tbl_DonThuoc tblDon = new tbl_DonThuoc();
                tblDon.LanKhamID = lanKhamCuoi();
                if (donbuo.Insert(tblDon))
                {

                }
                else
                {
                    MessageBox.Show("Ko them dc du lieu don kham");
                }
            }
            catch (Exception)
            {

                throw;
            }

        }

        int lanKhamCuoi()
        {
            BenhNhan_LanKhamBUO nblk = new BenhNhan_LanKhamBUO();
            tbl_BenhNhan_LanKham bn = nblk.GetLanKhamCuoi(int.Parse(idBN));
            return bn.LanKhamID;
        }
        private void cbbNoiNgoaiTru_SelectedIndexChanged(object sender, EventArgs e)
        {
            btnDanhSachCho.Visible = false;
            btnDangKy.Visible = false;
            if (cbbNoiNgoaiTru.SelectedItem.ToString().Equals(""))
            {
                btnDangKy.Visible = false;
                
            }
            else
            {
                if (cbbNoiNgoaiTru.SelectedItem.ToString().Equals("Nhập viện"))
                {
                    HospitalDBDataContext context = new HospitalDBDataContext();
                    int idkhoa=int.Parse(cbbKhoa.SelectedValue.ToString());
                    var list = context.tbl_Giuongs.Where(n => n.IsEmpty == (int)GiuongTrong.Empty && n.id_Ward==idkhoa).ToList<tbl_Giuong>();
                    if (list.ToList().Count == 0)
                    {
                        chonThoiGianCho();
                        btnDangKy.Visible = false;
                        btnDanhSachCho.Visible = true;

                        grbKeDonXepCho.Controls.Clear();
                        UCDanhSachCho dscho = new UCDanhSachCho();
                        dscho.Height = 238;
                        dscho.Width = 664;
                        grbKeDonXepCho.Controls.Add(dscho);

                        lblGiuongCho.Visible = true;
                        lblNgayRaVien.Visible = true;
                        lblNgayVao.Visible = true;
                        txtGiuongCho.Visible = true;
                        txtNgayDCVaoVien.Visible = true;
                        dtpNgayRaVien.Visible = true;
                    }
                    else 
                    { 
                        btnDangKy.Visible = true; 
                        btnDanhSachCho.Visible = false;

                        lblNgayVao.Visible = false;
                        lblNgayRaVien.Visible = false;
                        lblGiuongCho.Visible = false;
                        txtNgayDCVaoVien.Visible = false;
                        txtGiuongCho.Visible = false;
                        dtpNgayRaVien.Visible = false;
                    }
                }
                else 
                { 
                    btnDangKy.Visible = true; 
                    btnDanhSachCho.Visible = false;

                    lblNgayVao.Visible = false;
                    lblNgayRaVien.Visible = false;
                    lblGiuongCho.Visible = false;
                    txtNgayDCVaoVien.Visible = false;
                    txtGiuongCho.Visible = false;
                    dtpNgayRaVien.Visible = false;
                }
            }


        }
        
        private void cbbKhoa_SelectedIndexChanged(object sender, EventArgs e)
        {
            var list = context.tbl_NhanViens.Join(context.tbl_Khoas,
                c => c.KhoaID,
                o => o.id_Ward,
                (c, o) => new
                {
                    NhanVienID = c.NhanVienID,
                    Ten = c.LastName,
                    Khoa = o.id_Ward

                }).Where(n => n.Khoa == int.Parse(cbbKhoa.SelectedValue.ToString()));


            if (list.ToList().Count == 0)
            {
                cbbBacSy.Text = "";
            }
            cbbBacSy.DataSource = list;
            cbbBacSy.DisplayMember = "Ten";
            cbbBacSy.ValueMember = "NhanVienID";
        }
        /// <summary>
        /// Hiện dữ liệu Nội ngoại trú lên combobox
        /// </summary>
        void LoadCB()
        {
            ComboboxItem item1 = new ComboboxItem("", 0);
            ComboboxItem item2 = new ComboboxItem("Ngoại trú", 1);
            ComboboxItem item3 = new ComboboxItem("Nhập viện", 2);
            List<ComboboxItem> list = new List<ComboboxItem>();
            list.Add(item1);
            list.Add(item2);
            list.Add(item3);

            cbbNoiNgoaiTru.DataSource = list;
            cbbNoiNgoaiTru.DisplayMember = "Text";
            cbbNoiNgoaiTru.ValueMember = "Value";
        }

        private void cbbKhoa_SelectedIndexChanged_1(object sender, EventArgs e)
        {

        }

        private void btnDanhSachCho_Click(object sender, EventArgs e)
        {
            if (kiemTraCoBNTrongDsCho(int.Parse(idBN))==false)
            {
                Insert_BN_LanKham();
                //insertDsCho();
                btnDanhSachCho.Visible = false;
                //hien thi danh sach cho 
                chonThoiGianCho();
            }
            else
            {
                MessageBox.Show("Bệnh nhân này đã có trong danh sách chờ");
            }
                      
        }
           
        
        //them vao danh sach cho cua tbl_BenhNhanNoiTru
        void insertDsCho()
        {
            //int lanKhamId = lanKhamCuoi();
            //HospitalDBDataContext context = new HospitalDBDataContext();
            //tbl_BenhNhanNoiTru tblBNNoiTru = new tbl_BenhNhanNoiTru();
            //BenhNhanNoiTruBUO bnNoiTruBUO = new BenhNhanNoiTruBUO();
            //tblBNNoiTru.LanKhamID = lanKhamId;
            
            //Nullable<int> i = new Nullable<int>();
            //i = null;
            //tblBNNoiTru.BedID = i;            
            //tblBNNoiTru.Date_Start = "";
            //tblBNNoiTru.Date_Finish = "";
            //tblBNNoiTru.Date_Wait = DateTime.Now.ToShortDateString();
            //tblBNNoiTru.IsWait = (int)Wait.Wait;
            //if (bnNoiTruBUO.Insert(tblBNNoiTru))
            //{
            //    lbThongBao.Text = "Xếp lịch chờ thành công";
            //}
            //else
            //{
            //    lbThongBao.Text = "Xếp lịch chờ ko thành công";
            //}
        }

        String chonThoiGianCho()
        {
            HospitalDBDataContext context = new HospitalDBDataContext();
            var d = context.tbl_BenhNhanNoiTrus.Join(
                context.tbl_Giuongs,
                c => c.BedID,
                o => o.BedID,
                (c, o) => new
                {
                    id_Ward = o.id_Ward,
                    BedID = o.BedID,
                    Date_Finish = c.Date_Finish,
                    isWait = c.IsWait

                }
                ).Where(e => e.id_Ward == int.Parse(cbbKhoa.SelectedValue.ToString()) && e.isWait==(int)Wait.notWait).OrderBy(k => k.Date_Finish);
            foreach (var item in d)
            {
                DateTime dt = (DateTime)item.Date_Finish;
                DateTime now = DateTime.Parse(DateTime.Now.ToShortDateString());
                if (DateTime.Compare(dt,now)>=0)
                {
                    var list = context.tbl_BenhNhanNoiTrus.Where(n => n.BedID == item.BedID && n.IsWait==(int)Wait.Wait);
                    if (list.ToList().Count==0)
                    {
                        var list2 = context.tbl_BenhNhanNoiTrus.Where(n => n.BedID == item.BedID).ToList<tbl_BenhNhanNoiTru>().FirstOrDefault();
                        txtGiuongCho.Text = list2.BedID.ToString();
                        txtNgayDCVaoVien.Text = list2.Date_Finish.ToString();

                        int lanKhamId = lanKhamCuoi();

                        tbl_BenhNhanNoiTru tblBNNoiTru = new tbl_BenhNhanNoiTru();
                        BenhNhanNoiTruBUO bnNoiTruBUO = new BenhNhanNoiTruBUO();
                        tblBNNoiTru.LanKhamID = lanKhamId;


                        tblBNNoiTru.BedID = list2.BedID;
                        tblBNNoiTru.Date_Start = list2.Date_Finish;
                        tblBNNoiTru.Date_Finish = DateTime.Parse(dtpNgayRaVien.Text);
                        tblBNNoiTru.Date_Wait = DateTime.Parse(DateTime.Now.ToShortDateString());
                        tblBNNoiTru.IsWait = (int)Wait.Wait;
                        if (bnNoiTruBUO.Insert(tblBNNoiTru))
                        {
                            lbThongBao.Text = "Xếp lịch chờ thành công";
                        }
                        else
                        {
                            lbThongBao.Text = "Xếp lịch chờ ko thành công";
                        }

                        break;
                    }
                }
            }
            return "";
        }



        String ngayGanRaVien()
        {
            String ngay = "";
            DateTime dtmax, dt2;
            HospitalDBDataContext context = new HospitalDBDataContext();
            //var list = from p in context.tbl_BenhNhanNoiTrus select p.Date_Finish;
            //DateTime[] dt = new DateTime[1000];
            //int i = 0;
            //foreach (String item in list)
            //{
            //    dt[i] = DateTime.Parse(item);
            //    i++;
            //}
            //dtmax = dt[0];
            //for (int ii = 1; ii < dt.Length; ii++)
            //{
            //    int result=DateTime.Compare(dtmax,dt[ii]);
            //    if (result<0)
            //    {
            //        dtmax = dt[ii];
            //    }
            //}

            //sắp xếp danh sách với ngày ra theo chiều giảm dần (theo thứ tự ra viện trước sau) của khoa đang chọn
            //var d = context.tbl_BenhNhanNoiTrus.Where(n => n.IsWait == (int)Wait.notWait).OrderBy(k => k.Date_Finish);
            var d=context.tbl_BenhNhanNoiTrus.Join(
                context.tbl_Giuongs,
                c=>c.BedID,
                o=>o.BedID,
                (c,o) => new 
                {
                    id_Ward=o.id_Ward,
                    BedID=o.BedID,
                    Date_Finish=c.Date_Finish,
                    isWait=c.IsWait
                }
                ).Where(e=>e.id_Ward==int.Parse(cbbKhoa.SelectedValue.ToString())).OrderBy(k=>k.Date_Finish);
            
            Hashtable hashtable = new Hashtable();
            //đưa giường và ngày ra vào hashtable
            foreach (var item in d)
            {
                DateTime now = DateTime.Now;
                DateTime dateFinish = DateTime.Parse(item.Date_Finish.ToString());
                if (DateTime.Compare(dateFinish,now)>=0)
                {
                    hashtable[item.BedID] = dateFinish.ToShortDateString();
                }
            }
            
            foreach (Hashtable item in hashtable)
            {
                int bedid = int.Parse(item.Keys.ToString());
                //kiểm tra giường đã có người chờ chưa
                var aa = context.tbl_BenhNhanNoiTrus.Where(n => n.BedID == bedid).Select(doi=>doi.IsWait).FirstOrDefault();
                MessageBox.Show(aa.ToString());
                break;
            }

            return ngay;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //ngayGanRaVien();
        }
        
    }


}
